package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.AcaoDAO;
import br.com.duosoftware.orcamento.daos.RegiaoDAO;
import br.com.duosoftware.orcamento.entidades.Acao;
import br.com.duosoftware.orcamento.entidades.Regiao;
import br.com.duosoftware.orcamento.utils.ManagedBeanUtil;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 *
 */
@ManagedBean
@ViewScoped
public class RegiaoBean implements Serializable {

    private Regiao regiao;
    private RegiaoDAO regiaoDAO;
    private List<Regiao> regioes;
    //
    private AcaoBean acaoBean;

    public RegiaoBean() {

        acaoBean = (AcaoBean) ManagedBeanUtil.getContextInfo("#{acaoBean}");

        regiaoDAO = new RegiaoDAO();

    }

    public Regiao getRegiao() {
        return regiao;
    }

    public void setRegiao(Regiao regiao) {
        this.regiao = regiao;
    }

    public List<Regiao> getRegioes() {
        if (acaoBean.getAcao() != null) {

            regioes = regiaoDAO.listarRegioes(acaoBean.getAcao());

        }
        return regioes;
    }

    public void setRegioes(List<Regiao> regioes) {
        this.regioes = regioes;
    }

    /**
     * <b>Método que inicializa a regiao a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        regiao = new Regiao();
        regiao.setAcao(acaoBean.getAcao());

    }

    /**
     * <b>Método que adiciona ou edita uma Regiao</b><p>
     *
     * Após o término o método fecha o dialog de cadastro.
     * <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        AcaoDAO acaoDAO = new AcaoDAO();

        //*********************************************************************
        //É necessário salvar a ação antes de salvar a região
        //*********************************************************************
        acaoDAO.salvarOuAtualizar(acaoBean.getAcao());

        regiaoDAO.salvarOuAtualizar(regiao);

        double total = calcularTotalMetaFisica(acaoBean.getAcao());

        //*********************************************************************
        //Salvando a ação novamente para atualizar a meta física depois de
        //calculada
        //*********************************************************************
        acaoDAO.salvarOuAtualizar(acaoBean.getAcao());

        acaoBean.getAcao().setMetaFisica(total);

        regiao = new Regiao();

        regioes = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgRegiao.hide()");
        requestContext.update("formAcao:dtRegioes");

    }

    /**
     * <b>Método para iniciar o processo de edição de um Regiao.</b>
     * <p>
     *
     * Ele verifica se há um Regiao selecionada para edição, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um Regiao selecionado o médoto abre o dialog para edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (regiao == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgRegiao.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um Regiao.</b>
     * <p>
     *
     * Ele verifica se há uma Regiao selecionado para exclusão, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um Regiao selecionado o médoto abre um p:dialog para confirma
     * ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (regiao == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirRegiao.show()");
        }

    }

    /**
     * <b>Método para excluir um Regiao.</b>
     * <p>
     *
     * Ele verifica se a Regiao selecionado para exclusão está sendo utilizado
     * por alguma outra tabela do banco. Se estiver uma mensagem de aviso é dada
     * ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            AcaoDAO acaoDAO = new AcaoDAO();

            regiaoDAO.excluir(regiao);
            double total = calcularTotalMetaFisica(acaoBean.getAcao());
            acaoBean.getAcao().setMetaFisica(total);
            acaoDAO.salvarOuAtualizar(acaoBean.getAcao());
            regiao = new Regiao();
            regioes = null;

        } catch (ConstraintViolationException e) {

            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirRegiao.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b>
     * <p>
     *
     * O método instancia um novo objeto na variável Regiao para limpar as
     * infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        regiao = new Regiao();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgRegiao.hide()");
        requestContext.update("formAcao:dtRegioes");

    }

    //
    public double calcularTotalMetaFisica(Acao acao) {

        List<Regiao> rs = regiaoDAO.listarRegioes(acao);

        double total = 0.0;

        for (Regiao r : rs) {

            total += r.getAno1() + r.getAno2() + r.getAno3() + r.getAno4();

        }

        return total;

    }

}
